#include "Elfe.h"

#include <iomanip>

#include <boost/assign/list_of.hpp>

using namespace std;
using namespace boost::assign;

const unsigned Elfe::nbrEnsembles = 5;

const unsigned Elfe::nbrCapacites = 6;

const unsigned Elfe::ppAlloues = 45;

const vector< vector< unsigned> > Elfe::ensembleRacial =
  list_of< vector< unsigned > >
  ( list_of( 3)( 6)(19)(11)(10) )      // aquatiques
  ( list_of(14)( 8)(11)(10)( 6)(16) )  // gris
  ( list_of( 8)(11)(10)( 1)( 6) )      // drows
  ( list_of(14)( 8)(11)(10)( 6)( 18) ) // sylvestre  
  ( list_of(14)( 8)(11)(10)( 6)(16));  // haut elfe


const unsigned Elfe::taille = 19;

/**
 * Contient les capacités, puis les ensembles raciaux, à la fin.
 */
const vector< CapaciteRaciale > Elfe::Liste = list_of
  (CapaciteRaciale("Capacités magiques"               , 15))
  (CapaciteRaciale("Compagnion"                       , 10))
  (CapaciteRaciale("Conférer la respiration aquatique", 10))
  (CapaciteRaciale("Dextérité renforcée"              , 20))
  (CapaciteRaciale("Faibles besoins de sommeil"       ,  5))
  (CapaciteRaciale("Furtivité"                        , 10))
  (CapaciteRaciale("Identification de la magie"       , 10))
  (CapaciteRaciale("Infravision"                      , 10))
  (CapaciteRaciale("Langage des plantes"              , 10))
  (CapaciteRaciale("Portes secrètes"                  ,  5))
  (CapaciteRaciale("Résistance aux charmes et sommeil", 10))
  (CapaciteRaciale("Résistance à la chaleur"          ,  5))
  (CapaciteRaciale("Résistance au froid"              ,  5))
  (CapaciteRaciale("Talent pour les arcs"             ,  5))
  (CapaciteRaciale("Talent pour les dagues"           ,  5))
  (CapaciteRaciale("Talent pour les épées"            ,  5))
  (CapaciteRaciale("Talent pour les javelots"         ,  5))
  (CapaciteRaciale("Talent pour les lances"           ,  5))
  (CapaciteRaciale("Talent pour les tridents"         ,  5));

/**
 * Contient la liste des ensembles raciaux..
 */
const vector< EnsembleCapacitesRaciales > Elfe::Ensembles = list_of
  ( EnsembleCapacitesRaciales("Elfe aquatique"                   , 40, ensembleRacial[0] ) )
  ( EnsembleCapacitesRaciales("Elfe gris"                        , 45, ensembleRacial[1] ) )
  ( EnsembleCapacitesRaciales("Elfe Noir"                        , 45, ensembleRacial[2] ) )
  ( EnsembleCapacitesRaciales("Elfe sylvestre"                   , 40, ensembleRacial[3] ) )
  ( EnsembleCapacitesRaciales("Haut-Elfe"                        , 40, ensembleRacial[4] ) );

const vector< Prerequis > Elfe::Limites = list_of
  ( Prerequis( 1, 6, 18 ) )
  ( Prerequis( 2, 7, 18 ) )
  ( Prerequis( 3, 8, 18 ) )
  ( Prerequis( 5, 8, 18 ) );

/**
 * Les Elfes ont +1 en Dextérité, -1 en Constitution.
 */
const map< unsigned, int > Elfe::AjustTraits = map_list_of
  ( 1, 1 )
  ( 2, -1 );

/**
 * Constructeur simplifié, qui remplit simplement le conteneur des capacités.
 * Il est utilisé lors de la lecture d'un fichier XML.
 *
 * @param[in] cap conteneur des capacité
 */
Elfe::Elfe(vector<unsigned> cap)
  :Race("Elfe")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  Capacites.assign( cap.begin(), cap.end() );
}

/**
 * Constructeur usuel, qui permet de créer un Elfe en sélectionnant
 * ses capacités.
 *
 * @param[in] PP nombre de pp, passé en argument afin de pouvoir
 * récupérer les pp non dépensé
 */
Elfe::Elfe(unsigned& PP)
  :Race("Elfe")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  blank() << setfill('*') << setw(56) << '*' << endmsg;
  blank() << "Création d'un elfe" << endmsg << endmsg;

  PP += 45;
  construitRace( PP );
  
  blank() << endmsg << setfill('*') << setw(56) << '*' << endmsg;
}

Elfe::Elfe()
  :Race("Elfe")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;
}

/**
 * Constructeur de "copie", qui permet de créer une instance à partir
 * de MetaClasse.
 *
 * @param[in] ptr pointeur sur l'instance à copier.
 */
Elfe::Elfe(Race *ptr)
  : Race( *ptr )
{}

/**
 * Destructeur, ne fait rien de spécial.
 */
Elfe::~Elfe()
{}
